package com.lvhx.springboot.partitioner;

import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

/**
 * 数据分组器
 *
 * @author lubiao
 */
@Component
public class DataDivider {
    /**
     * 指定分组数目，然后根据分组数目对传入数据进行分组操作
     *
     * @param data     待分组数据
     * @param groupNbr 需要分组的数目
     * @return
     */
    public List<List<Object>> divideByGroupNbr(List<Object> data,
                                               int groupNbr) {
        List<List<Object>> list = new ArrayList<List<Object>>();

        if (data == null || data.size() == 0) {
            ArrayList<Object> placeHolder = new ArrayList<Object>();
            list.add(placeHolder);
            return list;
        }

        int length = data.size();
        if (length <= groupNbr || groupNbr == 1) {
            list.add(data);
            return list;
        } else {
            int part = length / groupNbr;// 每一份的数量
            int remainder = length % groupNbr;// 未参与分组的数据量

            for (int i = 0; i < groupNbr; i++) {
                List<Object> temp = new ArrayList<Object>();
                for (int j = i * part; j < (i + 1) * part; j++) {
                    temp.add(data.get(j));
                }
                list.add(temp);
            }
            if (remainder > 0) {
                for (int k = 0; k < remainder; k++) {
                    list.get(k).add(data.get(part * groupNbr + k));
                }
            }
        }
        return list;
    }

    /**
     * 指定每一份的配额，然后根据配额对传入数据进行拆分操作
     *
     * @param data  待分组数据
     * @param quota 每一份的配额
     * @return
     */
    public List<List<Object>> divideByQuota(List<Object> data, int quota) {
        List<List<Object>> list = new ArrayList<List<Object>>();

        if (data == null || data.size() == 0) {
            ArrayList<Object> placeHolder = new ArrayList<Object>();
            list.add(placeHolder);
            return list;
        }

        int length = data.size();
        if (length <= quota) {
            list.add(data);
            return list;
        } else {
            int part = quota;// 每一份的数量
            int groupNbr = length / quota;// 分组数量
            int remainder = length % quota;// 未参与分组的数据数量

            for (int i = 0; i < groupNbr; i++) {
                List<Object> temp = new ArrayList<Object>();
                for (int j = i * part; j < (i + 1) * part; j++) {
                    temp.add(data.get(j));
                }
                list.add(temp);
            }
            if (remainder > 0) {// 把剩余数据进行单独分组
                List<Object> temp = new ArrayList<Object>();
                for (int k = 0; k < remainder; k++) {
                    temp.add(data.get(part * groupNbr + k));
                }
                list.add(temp);
            }
        }
        return list;
    }
}
